package jp.co.dailyReport.weeklyReport.action;

import java.io.IOException;
import java.util.Calendar;
import java.util.Vector;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.DynaActionForm;
import jp.co.dailyReport.DataUnavailableException;
import jp.co.dailyReport.PermissionException;
import jp.co.dailyReport.Utilities;
import jp.co.dailyReport.SystemCalendar;
import jp.co.dailyReport.staff.Staff;
import jp.co.dailyReport.staff.StaffManager;
import jp.co.dailyReport.project.Project;
import jp.co.dailyReport.project.ProjectManager;
import jp.co.dailyReport.project.PjStaff;
import jp.co.dailyReport.project.PjStaffManager;
import jp.co.dailyReport.workItem.WorkItem;
import jp.co.dailyReport.workItem.WorkItemManager;
import jp.co.dailyReport.weeklyReport.WeeklyReportWorkItem;
import jp.co.dailyReport.weeklyReport.WeeklyReport;
import jp.co.dailyReport.weeklyReport.WeeklyReportManager;
import jp.co.dailyReport.weeklyReport.WeeklyReportWorkItemManager;
import jp.co.dailyReport.Mail;
import jp.co.dailyReport.MailManager;

/**
 * 週報登録確認ページのボタン（戻る、登録、登録してメール送信）
 * が押されたときの処理を管理するクラスです。
 */
public class WeeklyReportCompletionAction extends Action {

	private static Logger log = Logger.getLogger(WeeklyReportCompletionAction.class);

	/**
	 * 週報登録確認ページのボタン（戻る、登録、登録してメール送信）
	 * が押されたときの処理を制御します。<BR><BR>
	 * 
	 * 「戻る」ボタンが押された場合の処理：<BR>
	 * 週報情報をセッションから取得して、DynaActionFormオブジェクトのフィールドに設定します。<BR>
	 * プロジェクトIDからプロジェクト情報を取得します。<BR>
	 * プロジェクトリーダーの社員IDからプロジェクトリーダーの社員情報を取得します。<BR>
	 * プロジェクトメンバーの社員IDからプロジェクトメンバーの社員情報を取得します。<BR><BR>
	 * 「登録」ボタンが押された場合の処理：<BR>
	 * 週報クラスのインスタンスを生成し、DynaActionFormオブジェクトのフィールド値を設定します。<BR>
	 * 週報オブジェクトの週報IDフィールド値が0の場合、週報情報をDBに登録します。<BR>
	 * 週報オブジェクトの週報IDフィールド値が0でない場合、週報情報をDBから更新し、週報作業項目情報を削除します。<BR>
	 * 週報作業項目情報をDBに登録します。<BR>
	 * 追加作業項目情報がある場合は、作業項目情報をDBに登録します。<BR><BR>
	 * 「登録してメール送信」ボタンが押された場合の処理：<BR>
	 * 週報クラスのインスタンスを生成し、DynaActionFormオブジェクトのフィールド値を設定します。<BR>
	 * 週報オブジェクトの週報IDフィールド値が0の場合、週報情報をDBに登録します。<BR>
	 * 週報オブジェクトの週報IDフィールド値が0でない場合、週報情報をDBから更新し、週報作業項目情報を削除します。<BR>
	 * 週報作業項目情報をDBに登録します。<BR>
	 * 追加作業項目情報がある場合は、作業項目情報をDBに登録します。<BR>
	 * 週報情報のメール送信処理を実行します。
	 * 
	 * @param mapping このインスタンスを選択するために使用したActionMapping
	 * @param form 存在するならば、このリクエストのためのActionForm Bean
	 * @param request 処理しているHTTPリクエスト
	 * @param response 処理しているHTTPレスポンス
	 * @return ActionForwardインスタンス
	 * @throws IOException, ServletException
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

		log.debug("WeeklyReportCompletionAction start");
		HttpSession session = request.getSession();
		log.debug("session.getId() = " + session.getId());
		Staff staff = (Staff)session.getAttribute("LoginStaff");
		WeeklyReportWorkItem[] weeklyReportWorkItem = (WeeklyReportWorkItem[])session.getAttribute("weeklyReportWorkItem");
		WorkItem[] workItemList = (WorkItem[])session.getAttribute("workItemList");
		DynaActionForm doWeeklyReportActionForm = (DynaActionForm)form;

		String target = null;
		Project project = null;
		Staff pLStaff = null;
		Staff[] staffList = null;

		if(request.getParameter("returnAdd") != null) {
			target = "returnAdd";
			if(request.getParameter("workItemAdd") != null) {
				WeeklyReport weeklyReport = (WeeklyReport)session.getAttribute("weeklyReport");
				doWeeklyReportActionForm.set("workDateStartY", new Integer(weeklyReport.getWorkDateStart().get(Calendar.YEAR)));
				doWeeklyReportActionForm.set("workDateStartM", new Integer(weeklyReport.getWorkDateStart().get(Calendar.MONTH)+1));
				doWeeklyReportActionForm.set("workDateStartD", new Integer(weeklyReport.getWorkDateStart().get(Calendar.DATE)));
				doWeeklyReportActionForm.set("workDateEndY", new Integer(weeklyReport.getWorkDateEnd().get(Calendar.YEAR)));
				doWeeklyReportActionForm.set("workDateEndM", new Integer(weeklyReport.getWorkDateEnd().get(Calendar.MONTH)+1));
				doWeeklyReportActionForm.set("workDateEndD", new Integer(weeklyReport.getWorkDateEnd().get(Calendar.DATE)));
				doWeeklyReportActionForm.set("weeklyReportId", new Integer(weeklyReport.getWeeklyReportId()));
				doWeeklyReportActionForm.set("projectId", new Integer(weeklyReport.getProjectId()));
				doWeeklyReportActionForm.set("staffId", new Integer(weeklyReport.getStaffId()));
				doWeeklyReportActionForm.set("problem", weeklyReport.getProblem());
				doWeeklyReportActionForm.set("comment", weeklyReport.getComment());
			}
			try {
				int projectId = ((Integer)doWeeklyReportActionForm.get("projectId")).intValue();
				project = ProjectManager.load(projectId);
				pLStaff = StaffManager.load(project.getPLStaffId());
				PjStaff[] pjStaff = PjStaffManager.getStaffId(projectId);
				staffList = new Staff[pjStaff.length];
				for(int i = 0; i < pjStaff.length; i++) {
					staffList[i] = StaffManager.load(pjStaff[i].getStaffId());
				}
				request.setAttribute("allStaffList", StaffManager.load());
			} catch(DataUnavailableException due) {
				log.error(due.getMessage());
			}

			request.setAttribute("project", project);
			request.setAttribute("pLStaff", pLStaff);
			request.setAttribute("staffList", staffList);
			request.setAttribute("systemCalendar", new SystemCalendar());
		} else {
			target = "completion";
			WeeklyReport weeklyReport = new WeeklyReport();
			try {
				Calendar workDateStart = Utilities.getCalendarTime(
				((Integer)doWeeklyReportActionForm.get("workDateStartY")).intValue(),
				((Integer)doWeeklyReportActionForm.get("workDateStartM")).intValue(),
				((Integer)doWeeklyReportActionForm.get("workDateStartD")).intValue(),
				0,0);
				Calendar workDateEnd = Utilities.getCalendarTime(
				((Integer)doWeeklyReportActionForm.get("workDateEndY")).intValue(),
				((Integer)doWeeklyReportActionForm.get("workDateEndM")).intValue(),
				((Integer)doWeeklyReportActionForm.get("workDateEndD")).intValue(),
				0,0);

				weeklyReport.setWorkDateStart(workDateStart);
				weeklyReport.setWorkDateEnd(workDateEnd);

				weeklyReport.setWeeklyReportId(((Integer)doWeeklyReportActionForm.get("weeklyReportId")).intValue());
				weeklyReport.setProjectId(((Integer)doWeeklyReportActionForm.get("projectId")).intValue());
				weeklyReport.setStaffId(staff.getStaffId());

				//PLの追加作業項目の稼働時間も加算
				Vector addWeeklyReportWorkItemList = (Vector)session.getAttribute("addWeeklyReportWorkItemList");
				WeeklyReportWorkItem[] wrwi = (WeeklyReportWorkItem[])addWeeklyReportWorkItemList.toArray(new WeeklyReportWorkItem[0]);
				double workingHours = 0;
				for (int i = 0; i < wrwi.length; i++) {
					workingHours = workingHours + wrwi[i].getWorkingHours();
				}
				weeklyReport.setTotalHoursWorked(WeeklyReportWorkItemManager.calculate(weeklyReportWorkItem) + workingHours);

				weeklyReport.setProblem((String)doWeeklyReportActionForm.get("problem"));
				weeklyReport.setComment((String)doWeeklyReportActionForm.get("comment"));
				int weeklyReportId = weeklyReport.getWeeklyReportId();
				String subjectPart = null;
				//週報登録処理
				if(weeklyReportId==0){
					WeeklyReportManager.insert(staff,weeklyReport);
					weeklyReportId = WeeklyReportManager.loadMaxID();
					subjectPart = "週報";
				//週報更新処理
				}else{
					WeeklyReportManager.update(staff,weeklyReport);
					subjectPart = "【訂正】週報";
				}
				for(int i = 0; i < weeklyReportWorkItem.length; i++) {
					if(WorkItemManager.load(weeklyReportWorkItem[i].getWorkItemId()).getAddStaffId()==0){
						weeklyReportWorkItem[i].setWeeklyReportId(weeklyReportId);
						WeeklyReportWorkItemManager.insert(weeklyReportWorkItem[i]);
					}
				}
				for(int i = 0; i < workItemList.length; i++) {
					WorkItemManager.update(workItemList[i]);
				}

				//追加作業項目の挿入
				Vector addWorkItemList = (Vector)session.getAttribute("addWorkItemList");
				if(addWorkItemList!=null){
					if(addWorkItemList.size()!=0){
						WorkItem[] workItem = (WorkItem[])addWorkItemList.toArray(new WorkItem[0]);
						for (int i = 0; i < workItem.length; i++) {
							workItem[i].setDisplayNm(WorkItemManager.loadMaxDisplayNm(workItem[i].getProjectId())+1);
							WorkItemManager.insertWeeklyReport(workItem[i]);
							wrwi[i].setWeeklyReportId(weeklyReportId);
							wrwi[i].setWorkItemId(WorkItemManager.loadMaxID());
							WeeklyReportWorkItemManager.insert(wrwi[i]);
						}
					}
				}

				weeklyReport.setWeeklyReportWorkItems(weeklyReportWorkItem);
				weeklyReport.setWeeklyReportWorkItems(wrwi);

				//「登録してメール送信」ボタンが押された時の処理
				if(request.getParameter("sendMail") != null) {
					Mail mail = new Mail();
					java.text.DateFormat df = new java.text.SimpleDateFormat("yyyyMMdd");
					String result = df.format(workDateEnd.getTime());
					String subject = subjectPart + result + Utilities.changeUniqueCharacter(ProjectManager.load(weeklyReport.getProjectId()).getName());
					mail.setWeeklyReportInfo(weeklyReport);
					mail.setSubject(subject);
					MailManager.sendWeeklyReportInfoMail(mail);
				}
			} catch(PermissionException e) {
				log.error(e.toString());
			} catch(DataUnavailableException due) {
				log.error(due.getMessage());
			}
		}
		log.debug("WeeklyReportCompletionAction end");
		return mapping.findForward(target);
	}
}
